home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 14 / Mac Magazin and MacEasy Magazine CD - Issue 14.iso / Wissenschaft & Technik / MacGzip 1.0b0 / Mac / FileTypes.c < prev    next >
Text File  |  1995-09-05  |  7KB  |  408 lines

  1. /*
  2.  * FileTypes.c
  3.  *
  4.  * Suffix mappings and file types
  5.  * August 15, 1995
  6.  * (c)1995 SPDsoft <MacSPD@ivo.cps.unizar.es>
  7.  *
  8.  * Requires IC ProgKit 1.1
  9.  *
  10.  */
  11.  
  12. #include <ctype.h> /* tolower */
  13.  
  14. #include "ICAPI.h"
  15. #include "ICKeys.h"
  16.  
  17. #include "FileTypes.h"
  18.  
  19. #include "Prefs.h"
  20. #include "GzErrors.h"
  21. #include "GzPStrings.h"
  22.  
  23.  
  24. /*
  25.  * Globals
  26.  */
  27.  
  28. static Boolean    CheckExtension( Str255 Name, Str255 Extension );
  29. static void     CheckFetchPrefs( Str255 pfName, TSufMapPtr SufMapPtr);
  30.  
  31. /*
  32.  * Functions
  33.  */
  34.  
  35. /******************************************************************************
  36.  *
  37.  * Fetch prefs stuff
  38.  *
  39.  */
  40.  
  41. #define kFetchPrefsNameStrID    131
  42. #define kFetchPrefsResourceType    'SUFX'
  43. #define kFetchPrefsResourceID    1
  44.  
  45. /*
  46.  * Get Fetch Prefs
  47.  */
  48. Boolean InitFetchMappings( Size *FPrefsSize, Handle *FPrefs )
  49. {
  50.     short    prefsResRefNum;
  51.     Boolean    result = TRUE;
  52.     
  53.     if ( *FPrefs != nil )
  54.         return result;
  55.  
  56.     if ( -1 != (prefsResRefNum = OpenPrefsResFile(fsRdPerm, false, kFetchPrefsNameStrID)) )
  57.     {
  58.         if ( nil != (*FPrefs = GetResource('SUFX',1)))
  59.         {
  60.             DetachResource(    *FPrefs );
  61.                 
  62.             if ( ResError() == noErr )
  63.             {
  64.                 *FPrefsSize = GetHandleSize(*FPrefs);
  65.                 result = ( MemError() != noErr );
  66.             }
  67.         }
  68.         CloseResFile(prefsResRefNum);
  69.     }
  70.  
  71.     if ( result )
  72.     {
  73.         *FPrefsSize = 0;
  74.         if(*FPrefs != nil)
  75.         {
  76.             DisposeHandle(*FPrefs);
  77.             *FPrefs = nil;
  78.         }
  79.     }
  80.     return result;
  81. }
  82.  
  83. void DisposeFetchMappings( Size *FPrefsSize, Handle *FPrefs )
  84. {
  85.     *FPrefsSize = 0;
  86.     if(*FPrefs != nil)
  87.     {
  88.         DisposeHandle(*FPrefs);
  89.         *FPrefs = nil;
  90.     }
  91. }
  92.  
  93. /******************************************************************************
  94.  *
  95.  * Internet Config stuff
  96.  *
  97.  * Get Internet Config Prefs
  98.  */
  99. Boolean InitICMappings( ICInstance *inst, Handle *ICmappings )
  100. {
  101.     Boolean ICErr = true;
  102.         
  103.     if ( *ICmappings != nil )
  104.         return ICErr;
  105.         
  106.     if (!ICStart(inst, 'GZIP'))
  107.     {                                                // init the sucker
  108.         if (!ICFindConfigFile(*inst, 0, nil))
  109.         {                                            // locate the config file
  110.             if (!ICBegin(*inst, icReadOnlyPerm))
  111.             {                                        // open up the file for reading
  112.                 ICAttr    attr = 0;
  113.  
  114.                 ICErr = false;
  115.                     
  116.                 if (!ICGetPrefHandle(*inst, (ConstStr255Param)kICMapping, &attr, ICmappings))
  117.                 {
  118.                         HUnlock(*ICmappings);
  119.                 }
  120.                 else
  121.                 {
  122.                     /* Can't get ICmappings */
  123.                     ICErr = true;
  124.                 }
  125.                 ICEnd(*inst);                            // all done
  126.             }
  127.         }
  128.     }
  129.         
  130.     if((ICErr)&&(*ICmappings != nil))
  131.     {
  132.         DisposeHandle(*ICmappings);
  133.         *ICmappings = nil;
  134.         
  135.         ICStop(*inst);
  136.     }
  137.     
  138.     return ICErr;
  139. }
  140.  
  141. void DisposeICMappings( ICInstance *inst, Handle *ICmappings )
  142. {
  143.     if(*ICmappings != nil)
  144.     {
  145.         DisposeHandle(*ICmappings);
  146.         *ICmappings = nil;
  147.         
  148.         ICStop(*inst);
  149.     }
  150. }
  151.  
  152. /******************************************************************************
  153.  *
  154.  * Generic functions
  155.  */
  156.  
  157. /*
  158.  * fName is a C string.
  159.  */
  160.  
  161. /*
  162.  *  IC Matching:
  163.  *
  164.  *    1. type, creator and extension match    11
  165.  *    2. type and extension match                10
  166.  *    3. extension and creator match            7
  167.  *    4. extension matches                    6
  168.  *    5. type and creator match                5
  169.  *    6. type matches                            4
  170.  *    7. anything else
  171.  *
  172.  *    T=4, C=1, E=6
  173.  */
  174.  
  175. #define kICTypeMatch        4
  176. #define kICCreatorMatch        1
  177. #define kICExtensionMatch    6
  178.  
  179. OSErr ResolveFileType( FSSpec *fSpec, char *fName, TSufMapPtr SufMapPtr, short Select )
  180. {
  181.     FInfo        vFInfo;
  182.     Str255        pfName;
  183.     OSErr        oserr;
  184.     long         pos = 0;
  185.     ICMapEntry    entry;
  186.     int            MatchingRank,
  187.                 BestMatchingRank = 0;
  188.  
  189.                 
  190.     if (Select & kRFTFromName ) /* from fName */
  191.     {
  192.         CStrToStr255( pfName, fName );
  193.     }
  194.     else /* from fSpec */
  195.     {
  196.         PStrCpy( pfName, fSpec->name);
  197.     }
  198.     
  199.     SufMapPtr->Found = FALSE;
  200.     
  201.     if (Select & kRFTUpload ) /* Mac -> Net */
  202.     {
  203.         if (Select & kRFTFromName )
  204.             oserr = GetFInfo(pfName,0,&vFInfo);
  205.         else
  206.             oserr = FSpGetFInfo(fSpec,&vFInfo);
  207.             
  208.         if ( oserr != noErr)
  209.             return oserr;
  210.             
  211.         SufMapPtr->Type = vFInfo.fdType;
  212.         SufMapPtr->Creator = vFInfo.fdCreator;
  213.         
  214.         switch ( Select & 0x00FF )
  215.         {
  216.             case kRFTIC:
  217.                 while ( noErr == ( oserr = (OSErr)ICGetMapEntry(SufMapPtr->ICinst, SufMapPtr->ICmappings, pos, &entry)))
  218.                 {
  219.                     pos += entry.total_length;
  220.                     MatchingRank = 0;
  221.  
  222.                     if (!(entry.flags & ICmap_not_outgoing_mask))
  223.                     {
  224.                         if( vFInfo.fdType == entry.file_type )
  225.                             MatchingRank += kICTypeMatch;
  226.                                     
  227.                         if( vFInfo.fdCreator == entry.file_creator)
  228.                             MatchingRank += kICCreatorMatch;
  229.                                 
  230.                         if (CheckExtension( pfName, entry.extension ))
  231.                                 MatchingRank += kICExtensionMatch;
  232.  
  233.                         if ( MatchingRank > BestMatchingRank )
  234.                         {
  235.                             BestMatchingRank = MatchingRank;
  236.                             /*
  237.                              * copy info
  238.                              */
  239.                             SufMapPtr->Binary = (entry.flags & ICmap_binary_mask);
  240.                             SufMapPtr->MacFile = (entry.flags & ICmap_resource_fork_mask);
  241.                             SufMapPtr->Found = TRUE;
  242. #ifdef EXTENSION_REQUIRED
  243.                             PStrCpy(SufMapPtr->Suffix, entry.extension);
  244. #endif
  245.                         }
  246.                                 
  247.                     }
  248.                 }/* while */
  249.  
  250.                 break;
  251.                 
  252.             case kRFTFetch:
  253.             
  254.                 CheckFetchPrefs( pfName, SufMapPtr);
  255.                 break;
  256.                 
  257.             default:
  258.                 break;
  259.         }
  260.     }
  261.     else /* Net -> Mac */
  262.     {
  263.         switch ( Select & 0x00FF )
  264.         {
  265.             case kRFTIC:
  266.  
  267.                 while ( noErr == ( oserr = ICGetMapEntry(SufMapPtr->ICinst, SufMapPtr->ICmappings, pos, &entry)))
  268.                 {
  269.                     pos += entry.total_length;
  270.                             
  271.                     if (!(entry.flags & ICmap_not_incoming_mask))
  272.                     {
  273.                         SufMapPtr->Type =        entry.file_type;
  274.                         SufMapPtr->Creator =    entry.file_creator;
  275.                         SufMapPtr->Binary =        (entry.flags & ICmap_binary_mask);
  276.                         SufMapPtr->MacFile =    (entry.flags & ICmap_resource_fork_mask);
  277.                                 
  278.                         
  279.                         if ( CheckExtension( pfName, entry.extension ))
  280.                         {
  281.                             SufMapPtr->Found = true;
  282.                             break;
  283.                         }
  284.                     }
  285.                 }
  286.  
  287.                 break;
  288.             case kRFTFetch:
  289.                 CheckFetchPrefs( pfName, SufMapPtr);
  290.                 break;
  291.             default:
  292.                 break;
  293.         }
  294.     }
  295.         
  296.     return oserr;
  297. }
  298.  
  299.  
  300. /******************************************************************************
  301.  *
  302.  * Local functions
  303.  */
  304.  
  305.  
  306. static Boolean CheckExtension( Str255 Name, Str255 Extension )
  307. {
  308.     /*
  309.      * test name vs extension
  310.      */
  311.     Boolean                result = FALSE;
  312.     register char        *n, *e;
  313.     long                elen, nlen;
  314.     
  315.     
  316.     if ( ( 0 != (elen = (long) Extension[0])) &&
  317.         ( 0 != (nlen = (long) Name[0])) )
  318.     {
  319.         
  320.         n = (char *)( &Name[0] + (Size) nlen );
  321.         e = (char *)( &Extension[0] + (Size) elen );
  322.         
  323.         while (
  324.                 (tolower(*n) == tolower(*e)) &&
  325.                 ( e > (char *)Extension ) &&
  326.                 ( n > (char *)Name )
  327.                 )
  328.         {
  329.             e --;
  330.             n --;
  331.         }
  332.         
  333.         result = ( e == (char *)Extension );
  334.                 
  335.     }
  336.     return result;
  337. }
  338.  
  339. static void CheckFetchPrefs( Str255 pfName, TSufMapPtr SufMapPtr)
  340. {
  341.     Ptr                pPrefs;
  342.     register char    *p;
  343.  
  344.     HLock( SufMapPtr->FPrefs );
  345.     
  346.     pPrefs = *(SufMapPtr->FPrefs);
  347.                     
  348.     while( pPrefs < (*(SufMapPtr->FPrefs) + SufMapPtr->FPrefsSize ))
  349.     {
  350.         SufMapPtr->Type =        *(OSType *)pPrefs;            pPrefs += 4;
  351.         SufMapPtr->Creator =    *(OSType *)pPrefs;            pPrefs += 4;
  352.         SufMapPtr->Binary =        (*(short *)pPrefs != 0);    pPrefs += 2;
  353.         SufMapPtr->MacFile =    (*(short *)pPrefs != 0);    pPrefs += 2;
  354.                         
  355.         p = & SufMapPtr->Suffix[1];
  356.         SufMapPtr->Suffix[0]=0x00;
  357.         
  358.         while((*p++ = *(char *)(pPrefs++))!=0)
  359.             SufMapPtr->Suffix[0]++;
  360.             
  361.                         
  362. #ifdef    GET_DESC
  363.         p = SufMapPtr->Description;
  364.         while((*p++= *(char *)(pPrefs++))!=0)
  365.             ;
  366. #else
  367.         while(*(char *)(pPrefs++)!=0)
  368.             ;
  369. #endif
  370.         
  371.         if ( CheckExtension( pfName, * (Str255 *) & SufMapPtr->Suffix ) )
  372.         {
  373.             SufMapPtr->Found = true;
  374.             break;
  375.         }                        
  376.  
  377.     }
  378.     
  379.     HUnlock( SufMapPtr->FPrefs );
  380.  
  381. }
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.